﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Alocacao.Presenter;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;
namespace Sinacor.UI.Bovespa.Alocacao.View.SmartClient
{
    public partial class AlocacaoDireta : SinacorWindow,IAlocacaoDireta
    {
        # region Campos
        private Sinacor.UI.Bovespa.Alocacao.Presenter.AlocacaoDireta _presenterAlocacaoDireta;
        public Sinacor.UI.Bovespa.Alocacao.Presenter.AlocacaoDireta PresenterAlocacaoDireta 
        { 
            get { return _presenterAlocacaoDireta; } 
        }
        #endregion

        #region Construtor

        public AlocacaoDireta()
        {
            this.InitializeComponent();
            dtgNegocios.NewItemType = typeof(Model.NegocioAlocadoDireto);
            dtgDisponiveis.NewItemType = typeof(Model.Negocio);
            dtgDigitacao.NewItemType = typeof(Model.DadosAlocacao);
            _presenterAlocacaoDireta = new Sinacor.UI.Bovespa.Alocacao.Presenter.AlocacaoDireta(this);
            this.DataContext = _presenterAlocacaoDireta;
            this.AfterInitialize += new RoutedEventHandler(AlocacaoDireta_AfterInitialize);
        }        
        #endregion

        #region Métodos de Evento

        protected void AlocacaoDireta_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            _presenterAlocacaoDireta.ListaDigitacao = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DadosAlocacao>();
            cmbMercado.ItemsSource = EnumWrapper<Model.Enum.TipoMercado>.GetEnums();

            _presenterAlocacaoDireta.Inicializar();
            this.HideUserWaitingProcess();
        }

        private void btnPesquisaAtivosAlocacao_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            Ordens.Model.Titulo modelTitulo = new Ordens.Model.Titulo();
            modelTitulo.Codigo = this._presenterAlocacaoDireta.Filtro.CodigoNegocio;
            modelTitulo.Mercado = null;
            modelTitulo.DataPregao = this._presenterAlocacaoDireta.Filtro.DataPregao;

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, null);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Titulo.Label.PesquisaTitulos");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this._presenterAlocacaoDireta.Filtro.CodigoNegocio = pesquisaTitulo.TituloEscolhido.Codigo;
                txtAtivoAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            }

            this.HideUserWaitingProcess();
        }

        private void btnPesquisar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                this.ClearServiceErrors();
                ShowUserWaitingProcess();
                BindConsultaNegocios();
                _presenterAlocacaoDireta.ConsultarNegocios();

                _presenterAlocacaoDireta.ListaDigitacao = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DadosAlocacao>();

            }

            finally
            {
                HideUserWaitingProcess();
            }
        }

        private void btnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            DefinirFiltroPadrao();
        }

        private void dtgNegocios_Deleting(object sender, CancelItemsEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.ClearServiceErrors();

            e.Cancel = true;
            e.Handled = true;

            if (dtgNegocios.SelectedItems != null)
            {
                ModelCollection<Model.NegocioAlocadoDireto> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioAlocadoDireto>();
                foreach (Model.NegocioAlocadoDireto item in dtgNegocios.SelectedItems)
                {
                    negocios.Add(item);
                }
                _presenterAlocacaoDireta.ExcluirNegocioAlocado(negocios);

            }
            this.HideUserWaitingProcess();
        }

        private void dtgDisponiveis_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ShowUserWaitingProcess();
                this.ClearServiceErrors();

                if (dtgDisponiveis.SelectedItems != null &&
                    dtgDisponiveis.SelectedItems.Count > 0)
                {

                    ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio>();

                    foreach (Sinacor.UI.Bovespa.Alocacao.Model.Negocio item in dtgDisponiveis.SelectedItems)
                    {
                        negocios.Add(item);
                    }
                    _presenterAlocacaoDireta.FiltrarAlocados(negocios);

                    this.dtgDigitacao.AllowBeginInsert = true;
                }
                else
                {
                    _presenterAlocacaoDireta.ListaAlocados = _presenterAlocacaoDireta.ListaAlocadosOriginal;
                    this.AtualizarListaAlocados();
                }

                this.HideUserWaitingProcess();
            }
        }

        private void dtgDigitacao_BeingInserted(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                IniciarDigitacao();

                Model.DadosAlocacao model = (Model.DadosAlocacao)e.ItemInfo.Item;
                model.QuantidadeEspecificar = _presenterAlocacaoDireta.QuantidadeEspecificar;
                model.Direcionado = new Sinacor.UI.Bovespa.Alocacao.Model.Direcionado();

                model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
                model.Direcionado.PropertyChanged += new PropertyChangedEventHandler(modelDirecionado_PropertyChanged);
            }
        }

        private void dtgDigitacao_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                BloquearTela();
            }
        }

        private void dtgDigitacao_InsertCanceled(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgDigitacao.Items.Count == 0)
                    CancelarDigitacao();
            }
        }

        private void dtgDigitacao_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                Model.DadosAlocacao model = (Model.DadosAlocacao)e.ItemInfo.Item;
                model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
                model.Direcionado.PropertyChanged += new PropertyChangedEventHandler(modelDirecionado_PropertyChanged);
            }
        }

        private void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Cliente")
            {
                this.ObterDirecionado();
            }
        }

        private void modelDirecionado_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "TipoLiquidacao")
            {
                this.ObterDirecionado();
            }
        }

        private void dtgDigitacao_Undid(object sender, ItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgDigitacao.Items.Count == 0)
                    CancelarDigitacao();
            }
        }

        private void dtgDigitacao_UndidAll(object sender, ItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                CancelarDigitacao();
            }
        }

        private void dtgDigitacao_SavingAll(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                ShowUserWaitingProcess();
                ClearServiceErrors();
                ModelCollection<Model.DadosAlocacao> negociosInseridos = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DadosAlocacao>();//= 
                foreach (var item in e.ItemsInfo)
                {
                    negociosInseridos.Add((Model.DadosAlocacao)item.Item);
                }


                ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio> negociosSelecionados = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio>();
                foreach (Sinacor.UI.Bovespa.Alocacao.Model.Negocio item in dtgDisponiveis.SelectedItems)
                {
                    negociosSelecionados.Add(item);
                }

                if (!_presenterAlocacaoDireta.SalvarDigitacao(negociosInseridos, negociosSelecionados))
                {
                    e.Cancel = true;
                    e.Handled = true;
                }
                else
                {
                    DesbloquearTela();
                    dtgDigitacao.AllowBeginInsert = false;
                }
                HideUserWaitingProcess();
            }
        }

        #endregion

        #region IAlocacaoDireta Members

        public void AtualizarListaAlocados()
        {
            dtgNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarListaBolsas()
        {
            cmbBolsa.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarListaDigitacao()
        {
            dtgDigitacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarListaDisponiveis()
        {
            dtgDisponiveis.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void BloquearColunaPercRedAcr()
        {
            dtgDigitacao.Columns["PercRedAcr"].AllowUpdate = false;
            dtgDigitacao.Columns["PercRedAcr"].AllowInsert = false;
        }

        public void BloquearColunaQuantidade()
        {
            dtgDigitacao.Columns["QtdEspecificar"].AllowUpdate = false;
            dtgDigitacao.Columns["QtdEspecificar"].AllowInsert = false;
        }

        public void BloquearColunasDirecionado()
        {
            dtgDigitacao.Columns["UsuarioDirecionado"].AllowUpdate = false;
            dtgDigitacao.Columns["ClienteDirecionado"].AllowUpdate = false;
            dtgDigitacao.Columns["DV2"].AllowUpdate = false;
            dtgDigitacao.Columns["UsuarioDirecionado"].AllowInsert = false;
            dtgDigitacao.Columns["ClienteDirecionado"].AllowInsert = false;
            dtgDigitacao.Columns["DV2"].AllowInsert = false;
        }

        public void DesbloquearColunasDirecionado()
        {
            dtgDigitacao.Columns["UsuarioDirecionado"].AllowUpdate = true;
            dtgDigitacao.Columns["ClienteDirecionado"].AllowUpdate = true;
            dtgDigitacao.Columns["DV2"].AllowUpdate = true;
            dtgDigitacao.Columns["UsuarioDirecionado"].AllowInsert = true;
            dtgDigitacao.Columns["ClienteDirecionado"].AllowInsert = true;
            dtgDigitacao.Columns["DV2"].AllowInsert = true;
        }

        public void BloquearDigitacao()
        {
            dtgDigitacao.IsEnabled = false;
            dtgDigitacao.AllowBeginInsert = false;
            dtgDigitacao.AllowBeginUpdate = false;
        }

        public void BloquearNovaLinhaDigitacao()
        {
            dtgDigitacao.AllowBeginInsert = false;
        }

        public void BloquearTela()
        {
            dtgDisponiveis.IsEnabled = false;
            dtgNegocios.IsEnabled = false;
            cmbPregao.IsEnabled = false;
            txtAtivoAlocacao.IsEnabled = false;
            btnPesquisaAtivosAlocacao.IsEnabled = false;
            cmbMercado.IsEnabled = false;
            cmbBolsa.IsEnabled = false;

            txtCliente.IsEnabled = false;
            txtNrNegocio.IsEnabled = false;
            rdbCompra.IsEnabled = false;
            rdbVenda.IsEnabled = false;
            btnPesquisar.IsEnabled = false;
            btnNovaPesquisa.IsEnabled = false;
        }

        private void DesbloquearTela()
        {
            dtgDisponiveis.IsEnabled = true;
            dtgNegocios.IsEnabled = true;
            cmbPregao.IsEnabled = true;
            txtAtivoAlocacao.IsEnabled = true;
            btnPesquisaAtivosAlocacao.IsEnabled = true;
            cmbMercado.IsEnabled = true;
            cmbBolsa.IsEnabled = true;

            txtCliente.IsEnabled = true;
            txtNrNegocio.IsEnabled = true;
            rdbCompra.IsEnabled = true;
            rdbVenda.IsEnabled = true;
            btnPesquisar.IsEnabled = true;
            btnNovaPesquisa.IsEnabled = true;

            this.dtgDigitacao.Columns["QtdEspecificar"].AllowInsert = true;
            this.dtgDigitacao.Columns["QtdEspecificar"].AllowUpdate = true;
        }

        public void CancelarDigitacao()
        {
            dtgDisponiveis.SelectedItem = null;
            
            dtgDigitacao.AllowBeginInsert = false;
            
            DesbloquearTela();
        }

        public void DefinirFiltroPadrao()
        {
            this._presenterAlocacaoDireta.ListaAlocados = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.NegocioAlocadoDireto>();
            this._presenterAlocacaoDireta.ListaDigitacao = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DadosAlocacao>();
            this._presenterAlocacaoDireta.ListaDisponiveis = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio>();
            this._presenterAlocacaoDireta.Filtro = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroNegocio();
            this.dtgDigitacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            this.dtgDisponiveis.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            this.dtgNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            this.txtNrNegocio.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            
            this.cmbPregao.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.cmbPregao.SelectedIndex = 0;
            
            this.cmbBolsa.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.cmbBolsa.SelectedIndex = 0;
            
            this.txtAtivoAlocacao.UpdateTarget(SinacorTextBox.TextProperty);
            this.txtCliente.UpdateTarget(SinacorTextBox.TextProperty);
            rdbCompra.IsChecked = true;
            rdbVenda.IsChecked = false;
            
            cmbMercado.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            cmbMercado.SelectedIndex = -1;

        }

        public void InformarRegistroNaoEncontrado()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Movimento.Message.DadosNaoEncontrados").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarAlocacaoGravada()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Movimento.Message.AlocacaoGravada").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarCancelamentoRealizado()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Movimento.Message.CancelamentoRealizado").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarUsuarioSemPermissao()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Movimento.ExceptionMessage.UsuarioSemPermissao").ToString(), SinacorMessageBoxImage.Information);
        }

        #endregion

        #region IAlocacaoBase Members

        public void AtualizarListaCalendarios()
        {
            cmbPregao.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        #endregion

        #region Metodos Privados

        public void LimparFiltro()
        {
            DefinirFiltroPadrao();
        }

        private void IniciarDigitacao()
        {
            ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio> negocios = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.Negocio>();

            foreach (Sinacor.UI.Bovespa.Alocacao.Model.Negocio item in dtgDisponiveis.SelectedItems)
            {
                negocios.Add(item);
            }

            _presenterAlocacaoDireta.IniciarDigitacao(negocios);
        }

        private void BindConsultaNegocios()
        {
            if (rdbCompra.IsChecked.Value)
                _presenterAlocacaoDireta.Filtro.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
            if (rdbVenda.IsChecked.Value)
                _presenterAlocacaoDireta.Filtro.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
        }

        private void ObterDirecionado()
        {
            if (dtgDisponiveis.SelectedItems != null && dtgDisponiveis.SelectedItems.Count == 1)
            {
                var digitado = (Model.DadosAlocacao)this.dtgDigitacao.GetCurrentRow().Item;
                var direcionado = _presenterAlocacaoDireta.ObterDirecionado(digitado, (Model.Negocio)dtgDisponiveis.SelectedItems[0]);
                if (direcionado != null)
                {
                    digitado.Direcionado = direcionado;
                    digitado.Direcionado.PropertyChanged += new PropertyChangedEventHandler(modelDirecionado_PropertyChanged);
                }
            }
        }

        #endregion

    }
}
